package com.shitou.shitouproduct.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.shitou.shitoucommons.utils.PageUtils;
import com.shitou.shitoucommons.utils.RespBean;
import com.shitou.shitouproduct.entity.SpuInfoEntity;
import com.shitou.shitouproduct.vo.ProductInfoVo;
import org.springframework.web.bind.annotation.RequestBody;

import java.math.BigDecimal;
import java.util.Map;

/**
 * spu信息
 *
 * @author 石头人
 * @email 3076767823@qq.com
 * @date 2023-03-04 18:03:45
 */
public interface SpuInfoService extends IService<SpuInfoEntity> {

    PageUtils queryPage(Map<String, Object> params);


    /**
     * 添加关于spu的所有信息
     * @param productInfoVo 映射类
     * @see ProductInfoVo
     * @return
     */
    RespBean editMemberProduct(ProductInfoVo productInfoVo);


    /**
     * @param productInfoVo 映射类
     * @see ProductInfoVo
     * @return
     */
    RespBean updateMemberProduct(ProductInfoVo productInfoVo);


    /**
     * 获得该用户发布的所有的商品
     *      // 包括已经售卖出去了的，正在售卖的，上架的，下架的,,, 状态为1的
     * @param productInfoVo 映射类
     * @see ProductInfoVo
     * @return RespBean
     */
    RespBean getProductByMember(ProductInfoVo productInfoVo);


    /**
     * 通过spu_id获取单个商品信息
     * @param productInfoVo 映射类
     * @see ProductInfoVo
     * @return RespBean
     */
    RespBean getProductBySpuId(ProductInfoVo productInfoVo);


    /**
     * 更新商品的上下架状态
     * @param productInfoVo 映射类
     * @see ProductInfoVo
     * @return RespBean
     */
    RespBean updatePublishStatus(ProductInfoVo productInfoVo);


    /**
     * 获得所有未出售且上架的二手商品
     * @return RespBean
     */
    RespBean getAllProduct();


    /**
     * 获得单个商品信息,主要用于商品的详情页
     * @param spuId 商品id
     * @return RespBean
     */
    RespBean getProduct(long spuId);


    /**
     * 远程调用，判断商品的当前状态,主要用于购物车的
     * @param spuIds 商品的id数组
     * @return RespBean
     */
    RespBean checkSaleCount(long[] spuIds);


    /**
     * 逻辑删除
     * @param spuId 商品id
     * @param memberId 会员id
     * @return RespBean
     */
    RespBean logicDeleteProduct(long spuId, long memberId);


    /**
     * 真实删除
     * @param spuId 商品id
     * @param memberId 会员id
     * @return RespBean
     */
    RespBean deleteProduct(long spuId, long memberId);


    /**
     * 远程调用获取spuInfo
     * @param spuId 商品id
     * @return RespBean
     */
    RespBean getSpuInfoVo(long spuId);


    /**
     * 远程调用获取商品对应的用户id
     * @param spuIds 商品id的数组
     * @return RespBean
     */
    RespBean getMemberId(long[] spuIds);


    /**
     * 通过spuIds获取相对于的product信息
     * @param spuIds 商品id
     * @return RespBean
     */
    RespBean getProductBySpuIds(long[] spuIds);


    /**
     * 构建searchVo搜索项,
     *      插入或者更新的时候，发起远程调用,创建ElasticSearch文档，通过spuId
     * @param spuInfo
     * @param open
     */
    void createSearchVo(SpuInfoEntity spuInfo, boolean open);


    /**
     * 远程调用  判断该商品是否是自己发布的
     * @param memberId
     * @param spuId
     * @return
     */
    RespBean checkPublisherIsMyself(Long memberId, Long spuId);


    /**
     * 远程调用  批量判断该商品是否是自己发布的
     * @param memberId
     * @param spuIds
     * @return
     */
    RespBean batchCheckPublisherIsMyself(Long memberId, Long[] spuIds);


    /**
     * 检查总价是否一致
     * @param spuIds
     * @param price
     * @return
     */
    RespBean checkProductPrice(Long[] spuIds, BigDecimal price);


    /**
     * 管理员
     * @param spuId
     * @param status
     * @return
     */
    RespBean offShelfProduct(Long spuId, Integer status);


}

